#include <func.h>

// 线程清理函数
void cleanup(void *p)
{
    free(p);
    printf("clean up func exec\n");
}

void *pthfunc(void *p)
{
    // int val = *(int *)p;
    long val = (long)p;
    printf("I am thread %ld\n", val);
    printf("after cancel %ld\n", val);

    char *q = (char *)malloc(20);
    pthread_cleanup_push(cleanup, q); // 清理函数压栈
    pthread_cleanup_pop(1); // 清理函数弹栈并执行

    pthread_exit((void *)1); // 判断子线程是否执行成功
}

int main() 
{
    pthread_t pthid[2];
    int ret;
    long thread_return, i; // 获得子线程返回值的方式，把指针的空间，用来传递一个整形数据
    for (i = 0; i < 2; i ++)
    {
        // 1. 子线程创建
        ret = pthread_create(&pthid[i], NULL, pthfunc, (void *)i); // 给子线程传参，注意参数不要在两个线程中都改（这样的话就要用指针传值）
        // ret = pthread_create(&pthid[i], NULL, pthfunc, (void *)&i); // 传的是地址，主线程里改变了，子线程里也会改变 
        THREAD_ERR_CHECK(ret, "pthread_create");
    }

    ret = pthread_cancel(pthid[0]); // printf 执行 write 是 cancel 点
    // 2. 等待子线程结束
    pthread_join(pthid[0], (void **)&thread_return); 
    pthread_join(pthid[1], (void **)&thread_return); 

    printf("main thread get pthid[1] return = %ld\n", thread_return);
    return 0;
}